
  
% 示例使用  
complex_num = 1 + 1i; % 示例复数  
preset_phase_value = pi / 4; % 预设相位值（例如，45度）  
tolerance = 1e-6; % 设置一个容差  
closest_phase = find_closest_phase(complex_num, preset_phase_value, tolerance);  
fprintf('The closest phase to the preset value is: %.6f radians\n', angle(complex_num));
fprintf('The closest phase to the preset value is: %.6f radians\n', closest_phase);



function closest_preset_phase = find_closest_phase(complex_number, preset_phase, tolerance)  
    % complex_number: 输入的复数  
    % preset_phase: 预设的相位值，需要在 -pi 到 pi 之间  
    % tolerance: 用于确定“最接近”的容差，可选参数，默认为一个很小的值  
    if nargin < 3  
        tolerance = eps; % 如果没有提供容差，则使用MATLAB的eps作为默认容差  
    end  
      
    % 计算复数的相位  
    phase_of_complex = angle(complex_number);  
      
    % 确保相位在 -pi 到 pi 之间  
    phase_of_complex = mod(phase_of_complex + pi, 2*pi) - pi;  
      
    % 初始化二分查找的区间  
    lower_bound = -pi;  
    upper_bound = pi;  
      
    % 由于我们是在一个连续区间上查找一个具体的值，  
    % 我们需要定义一个迭代停止的条件，这里使用容差来判断。  
    % 注意：这不是传统意义上的二分查找停止条件（即找到精确匹配或区间足够小），  
    % 因为我们在找最接近的值，所以需要一个容差来确定何时停止迭代。  
      
    % 初始化一个变量来存储当前最接近的相位值  
    % 初始时可以设置为区间中点，但实际上由于我们要找的是预设相位值，  
    % 所以这个变量在迭代过程中会被更新为最接近预设相位的值（通过比较得出）。  
    % 但由于我们实际上是在一个连续区间上逼近预设相位值，  
    % 我们不需要这个变量来存储中间结果，而是直接更新lower_bound和upper_bound。  
    % 这里保留这个注释是为了说明思路。  
      
    % 进行二分查找的迭代（使用容差作为停止条件）  
    while (upper_bound - lower_bound) / 2 > tolerance  
        mid_phase = (lower_bound + upper_bound) / 2;  
          
        % 计算中点相位与预设相位的差异（已规范化到 -pi 到 pi）  
        diff_to_preset = mod(mid_phase - preset_phase + pi, 2*pi) - pi;  
          
        % 根据差异的方向来缩小搜索区间  
        if diff_to_preset < 0  
            lower_bound = mid_phase;  
        else  
            upper_bound = mid_phase;  
        end  
          
        % 可选：打印每次迭代的信息（用于调试）  
        % fprintf('Iteration: Mid Phase = %.6f, Diff to Preset = %.6f, Lower Bound = %.6f, Upper Bound = %.6f\n', mid_phase, diff_to_preset, lower_bound, upper_bound);  
    end  
      
    % 迭代结束后，取区间的中点作为最接近预设相位的值（因为区间已经很小了）  
    closest_preset_phase = (lower_bound + upper_bound) / 2;  
      
    % 可选：对结果进行微调以确保它在 -pi 到 pi 之间（虽然由于容差的存在，这通常不是必需的）  
    closest_preset_phase = mod(closest_preset_phase + pi, 2*pi) - pi;  
      
    % 如果需要，可以检查最接近的相位值与预设相位值的差异是否小于容差  
    % assert(abs(mod(closest_preset_phase - preset_phase + pi, 2*pi) - pi) <= tolerance, 'The found phase is not within the specified tolerance.');  
end  
